package leetcode.biweekly.week80;

import java.util.HashSet;
import java.util.Set;

// 前缀和 累加和 注意用long 
// Solution1Test

//涉及mod (int) 1e9 + 7 减法要加一个mod
//mod问题哪怕是最后+1也要补一次mod

//注意数据量，尤其累加和的时候，前缀和的时候，注意用long
//注意边界，尤其是特殊取用的数组边界，不要想当然，避免不必要的wa

// 小样本状态压缩，哈希表，枚举状态
// 奇偶性 & 前缀和 的思路
public class Solution1 {

	// Solution1Test
	public boolean strongPasswordCheckerII(String password) {
		char[] cs = password.toCharArray();
		int len = cs.length;
		if (len < 8) {
			return false;
		}
		boolean x = false;
		for (int i = 0; i < cs.length; i++) {
			char c = cs[i];
			if (c >= 'a' && c <= 'z') {
				x = true;
				break;
			}
		}
		if (!x) {
			return false;
		}
		x = false;
		for (int i = 0; i < cs.length; i++) {
			char c = cs[i];
			if (c >= 'A' && c <= 'Z') {
				x = true;
				break;
			}
		}
		if (!x) {
			return false;
		}

		x = false;
		for (int i = 0; i < cs.length; i++) {
			char c = cs[i];
			if (c >= '0' && c <= '9') {
				x = true;
				break;
			}
		}
		if (!x) {
			return false;
		}
		char[] sp = "!@#$%^&*()-+".toCharArray();
		Set<Character> set = new HashSet<>();
		for (int i = 0; i < sp.length; i++) {
			set.add(sp[i]);
		}

		x = false;
		for (int i = 0; i < cs.length; i++) {
			char c = cs[i];
			if (set.contains(c)) {
				x = true;
				break;
			}
		}
		if (!x) {
			return false;
		}
		x = false;
		char last = cs[0];
		for (int i = 1; i < cs.length; i++) {
			char c = cs[i];
			if (last == c) {
				return false;
			}
			last = c;
		}
		return true;
	}

}
